package org.study.waitnotify;

/**
 * 类的描述
 *
 * @author Administrator
 * @date 2021-08-19
 */
public class WaitTest implements Runnable {
    public static void main(String[] args) {
        // 从结果中可以看出：线程调用 wait() 方法后一直在等待，不会继续往下执行。
        // 这也就能解释上面说的 wait() 一旦执行，除非接收到唤醒操作或者是异常中断，否则不会继续往下执行。
        WaitTest waitTest = new WaitTest();
        Thread thread = new Thread(waitTest);
        thread.start();
    }

    private final Object object = new Object();

    @Override
    public void run() {
        synchronized (object) {
            System.out.println("线程执行开始。。。");
            try {
                // 1、wait()是Object里面的方法，而不是Thread里面的，这一点很容易搞错。它的作用是将当前线程置于预执行队列，并在wait()所在的代码处停止，等待唤醒通知。
                // 2、wait()只能在同步代码块或者同步方法中执行，如果调用wait()方法，而没有持有适当的锁，就会抛出异常。
                // 3、wait()方法调用后悔释放出锁，线程与其他线程竞争重新获取锁。
                object.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程执行结束。。。");
        }
    }
}
